﻿namespace Digitalmes.Domain.Entities.Mes.Productions;

/// <summary>
/// 生产工单。
/// </summary>
/// <remarks>
/// <para>此处生产工单可进行拆分为多个子工单，子工单物料类型与父工单不同。</para>  
/// <para>若是自动生产中（来料零件码未绑定工单时），同一种产品在同一时刻应该只有一张工单处于准备或正在生产状态。</para>  
/// </remarks>
[SugarTable("prod_workorder")]
public sealed class ProdWorkOrder : AuditedEntity, ISoftDelete
{
    /// <summary>
    /// 父工单 Id。
    /// </summary>
    public long ParentId { get; set; }

    /// <summary>
    /// 工单编号
    /// </summary>
    [NotNull]
    public string? Wo { get; set; }

    /// <summary>
    /// 产品 Id。
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 工单编号
    /// </summary>
    public string? OrderNo { get; set; }

    /// <summary>
    /// 工单来源（手动导入、ERP下发）
    /// </summary>
    public int Source { get; set; }

    /// <summary>
    /// 批次号
    /// </summary>
    public string? BatchNo { get; set; }

    /// <summary>
    /// 选择生产的车间 Id
    /// </summary>
    public long WorkshopId { get; set; }

    /// <summary>
    /// 选择生产的生产线 Id
    /// </summary>
    public long LineId { get; set; }

    /// <summary>
    /// 选择生产的工艺路线 Id。
    /// </summary>
    public long RouteId { get; set; }

    /// <summary>
    /// 计划生产数量
    /// </summary>
    public int PlanQty { get; set; }

    /// <summary>
    /// 计划开始日期
    /// </summary>
    public DateTime PlanStartDate { get; set; }

    /// <summary>
    /// 计划完成日期
    /// </summary>
    public DateTime PlanEndDate { get; set; }

    /// <summary>
    /// 实际开始日期
    /// </summary>
    public DateTime? ActualStartDate { get; set; }

    /// <summary>
    /// 实际完成日期
    /// </summary>
    public DateTime? ActualEndDate { get; set; }

    /// <summary>
    /// 已上线数量
    /// </summary>
    public int OnlineQty { get; set; }

    /// <summary>
    /// 合格数量
    /// </summary>
    /// <remarks>OK下线产品都归于此数量。</remarks>
    public int QualifiedQty { get; set; }

    /// <summary>
    /// 不合格数量
    /// </summary>
    /// <remarks>中途NG产品都归于此数量，返修OK后从此数量中移除。</remarks>
    public int UnqualifiedQty { get; set; }

    /// <summary>
    /// 已报废数量
    /// </summary>
    public int ScrappedQty { get; set; }

    /// <summary>
    /// 是否为主工单。
    /// </summary>
    /// <remarks>最终生产的成品属于主工单，主工单数据会加入到产能统计中。</remarks>
    public bool IsMaster { get; set; }

    /// <summary>
    /// 描述
    /// </summary>
    public string? Remark { get; set; }

    /// <summary>
    /// 工单状态（0->初始化，1->已审核，2->已排产，3->已下发，4->生产中，5->已完工，6->已关闭，7->暂停，8->冻结）
    /// </summary>
    /// <remarks>
    /// 工单关闭：可手动关闭，
    /// </remarks>
    public WoStatusEnum Status { get; set; }

    /// <summary>
    /// 上一状态。
    /// </summary>
    /// <remarks>仅系统内部可见，用于切换部分工单状态时恢复到之前状态。如生产中的工单在“暂停”或“冻结”后，人工恢复后可还原到“生产中”状态。</remarks>
    public WoStatusEnum LastStatus { get; set; }

    public bool IsDeleted { get; set; }
}
